package com.starssea;

import com.starssea.config.CollectionConfig;
import com.starssea.config.Person;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ImportResource;

/**
 * 核心注解功能
 * SpringBootConfiguration: 配置类，包含 @Configuration 注解的功能
 * Configuration: JavaConfig的功能，结合 @Bean 能够将对象注入到spring的IOC容器
 * <p>
 * EnableAutoConfiguration: 开启自动配置。将spring和第三方库中的对象创建好，注入到
 * spring容器。避免写xml，去掉样板代码。需要使用的对象，由框架提供。
 * <p>
 * ComponentScan: 组件扫描器，<context: component-scan base-package="packageName"/>
 * 扫描 @Controller, @Service, @Repository, @Component注解，创建他们的对象注入
 * 到容器。约定扫描启动类所在目录以及子目录中的类。
 */
@ImportResource(locations = {"classpath:/applicationContext.xml"})
@EnableConfigurationProperties(CollectionConfig.class)
@SpringBootApplication
public class MySpringBootApplication {
    // run方法的第一个参数是 源（配置类），从这里加载bean，找到bean注入到spring容器
    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(MySpringBootApplication.class, args);

        Person person = run.getBean(Person.class);
        System.out.println("person = " + person);

    }
}

/*
 * 三种启动方式：
 * 开发工具，例如IDEA执行main方法
 * Maven插件，mvn spring-boot:run
 * java -jar 项目打包后的文件路径
 */
